using System;
using System.Collections;
using EnvDTE;
using EnvDTE80;

namespace Microsoft.WowAddonStudio.Tests.Common.Mocks
{
	/// <summary>
	/// Represents all projects and solution-wide properties in the integrated development environment (IDE). Use this object for functionality and refer to EnvDTE._Solution for documentation.
	/// </summary>
	public class MockSolution : Solution, Solution2
	{
		/// <summary>
		/// Initializes a new instance of the <see cref="MockSolution"/> class.
		/// </summary>
		/// <param name="dte">The DTE.</param>
		public MockSolution(DTE dte)
		{
			DTE = dte;
		}

		#region Solution Members

		/// <summary>
		/// Returns an enumeration for items in a collection.
		/// </summary>
		/// <returns>An enumerator.</returns>
		IEnumerator _Solution.GetEnumerator()
		{
			throw new NotImplementedException();
		}

		#region IEnumerable Members

		/// <summary>
		/// Returns an enumeration for items in a collection.
		/// </summary>
		/// <returns>An enumerator.</returns>
		IEnumerator IEnumerable.GetEnumerator()
		{
			throw new NotImplementedException();
		}

		#endregion

		#region Solution2 Members

		/// <summary>
		/// Returns a <see cref="T:EnvDTE.Project"/> object in a <see cref="T:EnvDTE.Projects"/> collection.
		/// </summary>
		/// <param name="index"></param>
		/// <returns>
		/// A <see cref="T:EnvDTE.Project"/> object.
		/// </returns>
        public EnvDTE.Project Item(object index)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Returns a <see cref="T:EnvDTE.Project"/> object in a <see cref="T:EnvDTE.Projects"/> collection.
		/// </summary>
		/// <param name="index"></param>
		/// <returns>
		/// A <see cref="T:EnvDTE.Project"/> object.
		/// </returns>
        EnvDTE.Project _Solution.Item(object index)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Returns an enumeration for items in a collection.
		/// </summary>
		/// <returns>An enumerator.</returns>
		public IEnumerator GetEnumerator()
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Saves as.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		void _Solution.SaveAs(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Copies an existing project file, and any items or subdirectories it contains, to the specified location and adds it to the solution.
		/// </summary>
		/// <param name="fileName">Required. The full path and file name with extension of the template project file.</param>
		/// <param name="Destination">Required. The full path of the directory in which to copy the contents of <paramref name="fileName"/>.</param>
		/// <param name="ProjectName">Required. The name of the project file in the destination directory. This should include the extension. The name displayed is derived from <paramref name="ProjectName"/>.</param>
		/// <param name="Exclusive">Optional. Indicates whether the project loads in the current solution or its own; true if the current solution is closed and the project is added to a new solution, false if the project is added to the existing open solution.</param>
		/// <returns>
		/// A <see cref="T:EnvDTE.Project"/> object.
		/// </returns>
        EnvDTE.Project _Solution.AddFromTemplate(string fileName, string Destination, string ProjectName, bool Exclusive)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Adds from file.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		/// <param name="Exclusive">if set to <c>true</c> [exclusive].</param>
		/// <returns></returns>
        EnvDTE.Project _Solution.AddFromFile(string fileName, bool Exclusive)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Saves as.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		public void SaveAs(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Adds from template.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		/// <param name="Destination">The destination.</param>
		/// <param name="ProjectName">Name of the project.</param>
		/// <param name="Exclusive">if set to <c>true</c> [exclusive].</param>
		/// <returns></returns>
        public EnvDTE.Project AddFromTemplate(string fileName, string Destination, string ProjectName, bool Exclusive)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Adds from file.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		/// <param name="Exclusive">if set to <c>true</c> [exclusive].</param>
		/// <returns></returns>
        public EnvDTE.Project AddFromFile(string fileName, bool Exclusive)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Opens the specified file name.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		void _Solution.Open(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Closes the current solution.
		/// </summary>
		/// <param name="SaveFirst">Optional. Indicates whether to save the solution before closing it; true if the solution should be saved prior to closing it, false if not.</param>
		void _Solution.Close(bool SaveFirst)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Opens the specified file name.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		public void Open(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Closes the current solution.
		/// </summary>
		/// <param name="SaveFirst">Optional. Indicates whether to save the solution before closing it; true if the solution should be saved prior to closing it, false if not.</param>
		public void Close(bool SaveFirst)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Removes the specified project from the solution.
		/// </summary>
		/// <param name="proj">Required. The project to remove from the solution.</param>
        void _Solution.Remove(EnvDTE.Project proj)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Creates an empty solution in the specified directory with the specified name.
		/// </summary>
		/// <param name="Destination">Required. The directory in which to create the .sln and .suo (solution) files.</param>
		/// <param name="Name">Required. The name to display in Solution Explorer. This is also the base name of the .sln and .suo files.</param>
		void _Solution.Create(string Destination, string Name)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Removes the specified project from the solution.
		/// </summary>
		/// <param name="proj">Required. The project to remove from the solution.</param>
        public void Remove(EnvDTE.Project proj)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Creates an empty solution in the specified directory with the specified name.
		/// </summary>
		/// <param name="Destination">Required. The directory in which to create the .sln and .suo (solution) files.</param>
		/// <param name="Name">Required. The name to display in Solution Explorer. This is also the base name of the .sln and .suo files.</param>
		public void Create(string Destination, string Name)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Locates an item in a project.
		/// </summary>
		/// <param name="fileName">Required. The name of the project item.</param>
		/// <returns>
		/// A <see cref="T:EnvDTE.ProjectItem"/> object.
		/// </returns>
		ProjectItem _Solution.FindProjectItem(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Finds the project item.
		/// </summary>
		/// <param name="fileName">Name of the file.</param>
		/// <returns></returns>
		public ProjectItem FindProjectItem(string fileName)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Returns the location of project item templates for the specified project type.
		/// </summary>
		/// <param name="ProjectKind">Required. The <see cref="T:EnvDTE.Constants"/>.vsProjectKind* project template representing the project type.</param>
		/// <returns>
		/// The path to the templates of the given project type.
		/// </returns>
		string _Solution.ProjectItemsTemplatePath(string ProjectKind)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Gets the top-level extensibility object.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.DTE"/> object.</returns>
		DTE _Solution.DTE
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Returns the location of project item templates for the specified project type.
		/// </summary>
		/// <param name="ProjectKind">Required. The <see cref="T:EnvDTE.Constants"/>.vsProjectKind* project template representing the project type.</param>
		/// <returns>
		/// The path to the templates of the given project type.
		/// </returns>
		public string ProjectItemsTemplatePath(string ProjectKind)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Adds a solution folder to a <see cref="T:EnvDTE.ProjectItems"/> collection.
		/// </summary>
		/// <param name="Name">The name of the solution folder.</param>
		/// <returns>
		/// A <see cref="T:EnvDTE.Project"/> object.
		/// </returns>
        public EnvDTE.Project AddSolutionFolder(string Name)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Returns a path to the indicated project template.
		/// </summary>
		/// <param name="TemplateName">The name of the template.</param>
		/// <param name="Language">The language used to write the template.</param>
		/// <returns>The full name of the project template.</returns>
		public string GetProjectTemplate(string TemplateName, string Language)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Returns a path to the indicated project item template.
		/// </summary>
		/// <param name="TemplateName">The name of the template.</param>
		/// <param name="Language">The language used to write the template.</param>
		/// <returns>
		/// The full name of the project item template.
		/// </returns>
		public string GetProjectItemTemplate(string TemplateName, string Language)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Gets the top-level extensibility object.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.DTE"/> object.</returns>
		public DTE DTE { get; set; }

		/// <summary>
		/// Gets the immediate parent object of a <see cref="T:EnvDTE._Solution"/>.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.DTE"/> object.</returns>
		DTE _Solution.Parent
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a value indicating the number of objects in the collection.
		/// </summary>
		/// <value></value>
		/// <returns>The number of objects in the collection.</returns>
		int _Solution.Count
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the immediate parent object of a <see cref="T:EnvDTE._Solution"/>.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.DTE"/> object.</returns>
		public DTE Parent
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a value indicating the number of objects in the collection.
		/// </summary>
		/// <value></value>
		/// <returns>The number of objects in the collection.</returns>
		public int Count
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Microsoft Internal Use Only.
		/// </summary>
		/// <value></value>
		/// <returns/>
		string _Solution.FileName
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Microsoft Internal Use Only.
		/// </summary>
		/// <value></value>
		/// <returns/>
		public string FileName
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a collection of all properties that pertain to the <see cref="T:EnvDTE._Solution"/>.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Properties"/> collection.</returns>
		Properties _Solution.Properties
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Microsoft Internal Use Only.
		/// </summary>
		/// <value></value>
		bool _Solution.IsDirty
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the full path and name of the object's file.
		/// </summary>
		/// <value></value>
		/// <returns>The full path and name of the object's file.</returns>
		string _Solution.FullName
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a collection of all properties that pertain to the <see cref="T:EnvDTE._Solution"/>.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Properties"/> collection.</returns>
		public Properties Properties
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Microsoft Internal Use Only.
		/// </summary>
		/// <value></value>
		public bool IsDirty
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the full path and name of the object's file.
		/// </summary>
		/// <value></value>
		/// <returns>The full path and name of the object's file.</returns>
		public string FullName
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Returns true if the object has not been modified since last being saved or opened.
		/// </summary>
		/// <value></value>
		/// <returns>A Boolean value indicating true (default) if the object has not been modified since last being saved or opened; false if otherwise.</returns>
		bool _Solution.Saved
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the <see cref="T:EnvDTE.Globals"/> that contains add-in values that may be saved in the solution (.sln) file, the project file, or in the user's profile data.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Globals"/> object.</returns>
		Globals _Solution.Globals
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets an <see cref="T:EnvDTE.AddIns"/> collection, which contains all currently available add-ins associated with the solution.
		/// </summary>
		/// <value></value>
		/// <returns>An <see cref="T:EnvDTE.AddIns"/> collection.</returns>
		AddIns _Solution.AddIns
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Returns true if the object has not been modified since last being saved or opened.
		/// </summary>
		/// <value></value>
		/// <returns>A Boolean value indicating true (default) if the object has not been modified since last being saved or opened; false if otherwise.</returns>
		public bool Saved
		{
			get { throw new NotImplementedException(); }
			set { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the <see cref="T:EnvDTE.Globals"/> that contains add-in values that may be saved in the solution (.sln) file, the project file, or in the user's profile data.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Globals"/> object.</returns>
		public Globals Globals
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets an <see cref="T:EnvDTE.AddIns"/> collection, which contains all currently available add-ins associated with the solution.
		/// </summary>
		/// <value></value>
		/// <returns>An <see cref="T:EnvDTE.AddIns"/> collection.</returns>
		public AddIns AddIns
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a list of available Extenders for the object.
		/// </summary>
		/// <value></value>
		/// <returns>An object containing an automation-compliant array of strings.</returns>
		object _Solution.ExtenderNames
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the Extender category ID (CATID) for the object.
		/// </summary>
		/// <value></value>
		/// <returns>A GUID representing the CATID of the object.</returns>
		string _Solution.ExtenderCATID
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a list of available Extenders for the object.
		/// </summary>
		/// <value></value>
		/// <returns>An object containing an automation-compliant array of strings.</returns>
		public object ExtenderNames
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the Extender category ID (CATID) for the object.
		/// </summary>
		/// <value></value>
		/// <returns>A GUID representing the CATID of the object.</returns>
		public string ExtenderCATID
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Determines if a solution is open.
		/// </summary>
		/// <value></value>
		/// <returns>true if a solution is open; otherwise, false.</returns>
		bool _Solution.IsOpen
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Determines if a solution is open.
		/// </summary>
		/// <value></value>
		/// <returns>true if a solution is open; otherwise, false.</returns>
		public bool IsOpen
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets the <see cref="T:EnvDTE.SolutionBuild"/> object for the solution, which represents the root of the build automation model at the solution level.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.SolutionBuild"/> object.</returns>
		SolutionBuild _Solution.SolutionBuild
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a collection of the projects currently in the solution.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Projects"/> collection.</returns>
		Projects _Solution.Projects
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Get_s the template path.
		/// </summary>
		/// <param name="ProjectType">Type of the project.</param>
		/// <returns></returns>
		string _Solution.get_TemplatePath(string ProjectType)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Get_s the extender.
		/// </summary>
		/// <param name="ExtenderName">Name of the extender.</param>
		/// <returns></returns>
		object _Solution.get_Extender(string ExtenderName)
		{
			throw new NotImplementedException();
		}

		#endregion

		/// <summary>
		/// Gets the <see cref="T:EnvDTE.SolutionBuild"/> object for the solution, which represents the root of the build automation model at the solution level.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.SolutionBuild"/> object.</returns>
		public SolutionBuild SolutionBuild
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Gets a collection of the projects currently in the solution.
		/// </summary>
		/// <value></value>
		/// <returns>A <see cref="T:EnvDTE.Projects"/> collection.</returns>
		public Projects Projects
		{
			get { throw new NotImplementedException(); }
		}

		/// <summary>
		/// Get_s the template path.
		/// </summary>
		/// <param name="ProjectType">Type of the project.</param>
		/// <returns></returns>
		public string get_TemplatePath(string ProjectType)
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Get_s the extender.
		/// </summary>
		/// <param name="ExtenderName">Name of the extender.</param>
		/// <returns></returns>
		public object get_Extender(string ExtenderName)
		{
			throw new NotImplementedException();
		}

		#endregion
	}
}